package cn.iocoder.yudao.module.product.service.sku;

import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.module.esim.api.esproduct.EsProductApi;
import cn.iocoder.yudao.module.esim.api.esproduct.dto.EsProductDTO;
import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSkuSaveReqV2VO;
import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.yudao.module.product.dal.mysql.sku.ProductSkuMapper;
import cn.iocoder.yudao.module.product.enums.ErrorCodeConstants;
import cn.iocoder.yudao.module.product.util.ProductUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Set;

/**
 * Description:
 * Author: li
 * Date: 2024/3/14
 */
@Service
@Slf4j
public class ESimSkuServiceImpl implements IESimSkuService {
    @Resource
    private ProductSkuMapper productSkuMapper;
    @Lazy
    @Resource
    private EsProductApi esProductApi;

    @Override
    public List<ProductSkuDO> searchSpuByDataAllowanceAndValidityPeriodDays(Set<Long> spuIdSet,
                                                                            Integer esDataAllowanceMb,
                                                                            Integer esValidityPeriodDaysMin,
                                                                            Integer esValidityPeriodDaysMax) {
        return productSkuMapper.searchSpuByDataAllowanceAndValidityPeriodDays(
                spuIdSet, esDataAllowanceMb, esValidityPeriodDaysMin, esValidityPeriodDaysMax
        );
    }

    @Override
    public ProductSkuDO getSkuByEsProductId(String esProductId) {
        return productSkuMapper.getSkuByEsProductId(esProductId);
    }

    @Override
    public void checkCreateOrUpdateSku(ProductSkuSaveReqV2VO createReqVO, ProductSpuDO spu, boolean create) {
        ProductUtil.checkFieldNullable(createReqVO.getId(), createReqVO, "esProductId");// eSim商品id

        final String esProductId = createReqVO.getEsProductId();
        final EsProductDTO esProduct = esProductApi.getEsProduct(esProductId);
        if (esProduct == null) {
            log.warn("eSim商品id不存在, spuId = {}, esProductId = {}", spu.getId(), esProductId);
            throw ServiceExceptionUtil.exception(ErrorCodeConstants.SPU_FIELD_DEFAULT_ERROR, String.format("eSim商品id不存在 [%s]", esProductId));
        }

        createReqVO.setEsDataAllowanceMb(esProduct.getDataAllowanceMb());
        createReqVO.setEsValidityPeriodDays(esProduct.getValidityPeriodDays());
    }

}
